#include <math.h> // 引入头文件，使用fmin函数取最小值

// step 1# 主函数：求解到达楼顶的最小花费
int minCostClimbingStairs(int *cost, int costSize) {
    // step 1.1# 定义dp数组，dp[i]表示到达第i阶楼梯的最小花费
    int dp[costSize + 1];

    // step 1.2# 初始化前两个台阶的花费均为0（可以从地面直接起步）
    dp[0] = 0;
    dp[1] = 0;

    // step 1.3# 动态规划遍历，计算每一级楼梯的最小花费
    for (int i = 2; i <= costSize; i++) {
        // step 1.3.1# 状态转移方程：
        // 从i-2跨一步（加cost[i-2]），或者从i-1跨一步（加cost[i-1]），取最小
        dp[i] = fmin(dp[i - 2] + cost[i - 2], dp[i - 1] + cost[i - 1]);
    }

    // step 1.4# 返回到达楼顶（第costSize阶）的最小花费
    return dp[costSize];
}
